#ifndef __INPUT_BUF_H_
#define __INPUT_BUF_H_

#include <stdint.h>
#include <stdio.h>
#include <limits.h>

/**
 * @brief 输入缓冲
 *
 */

#define INPUT_BUF_MAX 1024

typedef struct _input_buf_st input_buf_st;
struct _input_buf_st
{
    char path[PATH_MAX + 1];     //<! 读取文件路径
    FILE *fp;                    //<! 文件指针
    uint8_t buff[INPUT_BUF_MAX]; //<! 读取文件的缓存
    uint32_t put_posi;           //<! 缓冲区头，写入数据的位置
    uint32_t get_posi;           //<! 缓冲区尾，读取数据的位置
    uint64_t fread_len;          //<! fread总计读取的长度
};

/**
 * @brief 申请一个input_buf
 *
 * @param path input_buf读取的文件路径
 * @return input_buf_st* 申请得到的input_buf指针
 */
input_buf_st *input_buf_malloc(
    char *path);

/**
 * @brief 释放input_buf
 *
 * @param input_buf 待释放的input_buf指针
 */
void input_buf_free(
    input_buf_st *input_buf);

/**
 * @brief 从input_buf中读取一个字符
 *
 * @param input_buf 读取的input_buf结构体的指针
 * @return uint8_t 返回读取的字符 没有读到字符，则返回'\0'
 */
uint8_t input_buf_get_char(
    input_buf_st *input_buf);

/**
 * @brief get_posi回退一个字节
 *
 * @param input_buf 需要回退的input_buf结构体指针
 * @return int32_t 0:回退成功; < 0:回退失败
 */
int32_t input_buf_goback(
    input_buf_st *input_buf);

/**
 * @brief  input_buf测试函数
 *
 */
void input_buf_test(
    void);

#endif